package com.northwind.dao;

import com.northwind.beans.Categoria;
import com.northwind.beans.Producto;
import com.northwind.beans.Proveedor;
import com.northwind.dao.base.BaseDAO;
import com.northwind.dto.ProductoDTO;
import java.sql.*;
import java.util.ArrayList;

public class ProductoDAO extends BaseDAO {

    public ArrayList<ProductoDTO> listarProductos(String nombreProducto, Integer idCategoria) throws SQLException {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        ArrayList<ProductoDTO> listaProductos = new ArrayList<ProductoDTO>(0);
        try {
            conn = DriverManager.getConnection(url, usuario, password);
            stmt = conn.createStatement();
            String sql = "SELECT p.ProductID, p.ProductName, c.CategoryName, s.CompanyName,p.UnitsInStock, p.UnitPrice " +
                    " FROM products p " +
                    " inner join categories c on c.CategoryID=p.CategoryID " +
                    " inner join suppliers s on s.SupplierID=p.SupplierID " +
                    " where upper(p.ProductName) like upper('" + nombreProducto + "%')";
            if (idCategoria != -1) {
                sql += " and p.CategoryID=" + idCategoria;
            }
            sql += " order by p.ProductName";
            rs = stmt.executeQuery(sql);
            ProductoDTO nuevoProducto;
            int contador = 0;
            while (rs.next()) {
                nuevoProducto = new ProductoDTO();
                nuevoProducto.setNro(++contador);
                nuevoProducto.setIdProducto(rs.getInt(1));
                nuevoProducto.setNombreProducto(rs.getString(2));
                nuevoProducto.setNombreCategoria(rs.getString(3));
                nuevoProducto.setNombreProveedor(rs.getString(4));
                nuevoProducto.setStock(rs.getInt(5));
                nuevoProducto.setPrecio(rs.getDouble(6));
                listaProductos.add(nuevoProducto);
            }
        } finally {
            if (rs != null) {  rs.close(); }
            if (stmt != null) { stmt.close(); }
            if (conn != null) { conn.close(); }
        }
        return listaProductos;
    }

    public Producto obtenerProducto(Integer idProducto) throws SQLException {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        Producto producto = null;
        try {
            conn = DriverManager.getConnection(url, usuario, password);
            String sql = "SELECT ProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit," +
                    " UnitPrice,UnitsInStock, UnitsOnOrder,ReorderLevel,Discontinued FROM products where ProductID=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, idProducto);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                producto = new Producto();
                producto.setIdProducto(rs.getInt(1));
                producto.setNombreProducto(rs.getString(2));
                
                Proveedor proveedor = new Proveedor();
                proveedor.setIdProveedor(rs.getInt(3));
                producto.setProveedor(proveedor);
                
                Categoria categoria = new Categoria();
                categoria.setIdCategoria(rs.getInt(4));
                producto.setCategoria(categoria);
                
                producto.setCantidadPorUnidad(rs.getString(5));
                producto.setPrecio(rs.getDouble(6));
                producto.setUnidadesEnStock(rs.getInt(7));
                producto.setUnidadesEnOrden(rs.getInt(8));
                producto.setReorderLevel(rs.getInt(9));
                producto.setDescontinuado(rs.getString(10).length() > 0 ? rs.getString(10).charAt(0) : ' ');
            }
        } finally {
            if (rs != null) {rs.close(); }
            if (pstmt != null) { pstmt.close(); }
            if (conn != null) {conn.close(); }
        }
        return producto;
    }

    public void registrarProducto(Producto producto) throws SQLException {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection(url, usuario, password);
            conn.setAutoCommit(false);
            String sql = "insert into products(" +
                    " ProductID,ProductName,SupplierID,CategoryID, QuantityPerUnit,UnitPrice," +
                    "UnitsInStock,UnitsOnOrder, ReorderLevel) values (?,?,?,?,?,?,?,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, nuevoId());
            pstmt.setString(2, producto.getNombreProducto());
            pstmt.setInt(3, producto.getProveedor().getIdProveedor());
            pstmt.setInt(4, producto.getCategoria().getIdCategoria());
            pstmt.setString(5, producto.getCantidadPorUnidad());
            pstmt.setDouble(6, producto.getPrecio());
            pstmt.setInt(7, producto.getUnidadesEnStock());
            pstmt.setInt(8, producto.getUnidadesEnOrden());
            pstmt.setInt(9, producto.getReorderLevel());
            pstmt.executeUpdate();
            conn.commit();
        } finally {
            if (rs != null) { rs.close(); }
            if (pstmt != null) {pstmt.close(); }
            if (conn != null) {conn.close(); }
        }
    }

    public Integer nuevoId() throws SQLException {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        Integer nuevoId = null;
        try {
            conn = DriverManager.getConnection(url, usuario, password);
            String sql = "SELECT coalesce(max(ProductID)) + 1 FROM products";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                nuevoId = rs.getInt(1);
            }
        } finally {
            if (rs != null) {rs.close(); }
            if (stmt != null) {stmt.close(); }
            if (conn != null) {conn.close(); }
        }
        return nuevoId;
    }

    public void actualizarProducto(Producto producto, int idProducto)  throws SQLException {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection(url, usuario, password);
            conn.setAutoCommit(false);
            String sql = "UPDATE `northwind`.`products` "
                    + "SET `ProductID`=?, `ProductName`=?, `SupplierID`=?, `CategoryID`=?,"
                    + " `QuantityPerUnit`=?, `UnitPrice`=?, `UnitsInStock`=?, `UnitsOnOrder`=?,"
                    + " `ReorderLevel`=? WHERE `ProductID`=?;";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, producto.getIdProducto());
            pstmt.setString(2, producto.getNombreProducto());
            pstmt.setInt(3, producto.getProveedor().getIdProveedor());
            pstmt.setInt(4, producto.getCategoria().getIdCategoria());
            pstmt.setString(5, producto.getCantidadPorUnidad());
            pstmt.setDouble(6, producto.getPrecio());
            pstmt.setInt(7, producto.getUnidadesEnStock());
            pstmt.setInt(8, producto.getUnidadesEnOrden());
            pstmt.setInt(9, producto.getReorderLevel());
            pstmt.setInt(10, idProducto);
            pstmt.executeUpdate();
            conn.commit();
        } finally {
            if (rs != null) { rs.close(); }
            if (pstmt != null) {pstmt.close(); }
            if (conn != null) {conn.close(); }
        }
    }

    
}
